import java.util.ArrayList;


public class JogoVelha implements JogoDaVelha{

	private ArrayList<ArrayList<String>> tabuleiro;
	private int numJogadas;
	
	public JogoVelha() {
		tabuleiro = new ArrayList<ArrayList<String>>();
		for(int i = 0 ; i < 3 ; i++)
		{
			tabuleiro.add(new ArrayList<String>()); // Adiciona tres slots em uma dimensao
			for(int j = 0 ; j < 3 ; j++)
			{
				tabuleiro.get(i).add(" "); // Adiciona tres slots em outra dimensao
			}
			
		}
		numJogadas = 0;
	}


	private Boolean verificaTerminouLateral(String marca, int y, int x)
	{
		int cont = 0;
		
		try {
			if(marca.equals(tabuleiro.get(y).get(x+1)))
				cont++;
			if(marca.equals(tabuleiro.get(y).get(x+2)))
				cont++;	
		} catch (Exception e) {
			;
		}
		
		try {
			if(marca.equals(tabuleiro.get(y).get(x-1)))
				cont++;
			if(marca.equals(tabuleiro.get(y).get(x-2)))
				cont++;	
		} catch (Exception e) {
			;
		}
		
		if(cont == 2)
			return true;
		else
			return false;
	}
	
	private Boolean verificaTerminouVertical(String marca, int y, int x)
	{
		int cont = 0;
		
		try {
			if(marca.equals(tabuleiro.get(y+1).get(x)))
				cont++;
			if(marca.equals(tabuleiro.get(y+2).get(x)))
				cont++;	
		} catch (Exception e) {
			;
		}
		
		try {
			if(marca.equals(tabuleiro.get(y-1).get(x)))
				cont++;
			if(marca.equals(tabuleiro.get(y-2).get(x)))
				cont++;	
		} catch (Exception e) {
			;
		}
		
		if(cont == 2)
			return true;
		else
			return false;
	}
	
	private Boolean verificaTerminouDiagonalPrincipal(String marca, int y, int x)
	{
		int cont = 0;
		
		try {
			if(marca.equals(tabuleiro.get(y+1).get(x+1)))
				cont++;
			if(marca.equals(tabuleiro.get(y+2).get(x+2)))
				cont++;	
		} catch (Exception e) {
			;
		}
		
		try {
			if(marca.equals(tabuleiro.get(y-1).get(x-1)))
				cont++;
			if(marca.equals(tabuleiro.get(y-2).get(x-2)))
				cont++;	
		} catch (Exception e) {
			;
		}
		
		if(cont == 2)
			return true;
		else
			return false;
	}
	
	private Boolean verificaTerminouDiagonalSecundaria(String marca, int y, int x)
	{
		int cont = 0;
		
		try {
			if(marca.equals(tabuleiro.get(y+1).get(x-1)))
				cont++;
			if(marca.equals(tabuleiro.get(y+2).get(x-2)))
				cont++;	
		} catch (Exception e) {
			;
		}
		
		try {
			if(marca.equals(tabuleiro.get(y-1).get(x+1)))
				cont++;
			if(marca.equals(tabuleiro.get(y-2).get(x+2)))
				cont++;	
		} catch (Exception e) {
			;
		}
		
		if(cont == 2)
			return true;
		else
			return false;
	}


	public ArrayList<ArrayList<String>> getTabuleiro() {
		return tabuleiro;
	}


	private Boolean verificaTerminou(String marca, int y, int x)
	{
		return verificaTerminouVertical(marca, y, x)
				||verificaTerminouLateral(marca, y, x)
				||verificaTerminouDiagonalPrincipal(marca, y, x)
				||verificaTerminouDiagonalSecundaria(marca, y, x);
	}
	
	
	@Override
	public int joga (Jogador j, int y, int x) throws IndexOutOfBoundsException {
		
		x--;
		y--;
		if(x > 2 || x < 0 || y < 0 || y > 2)
			throw new IndexOutOfBoundsException();

		if(tabuleiro.get(y).get(x) == " ")
		{
			tabuleiro.get(y).set(x, j.getMarca());
			numJogadas++;
		}
		else
			throw new IndexOutOfBoundsException();
		
		if(verificaTerminou(j.getMarca(), y, x))
			return 1;
		
		if(numJogadas == 9)
			return (-1);
		
		
		return 0;
					
	}
}
